package com.itheima.service.impl;

import cn.itheima.health.service.ReportService;
import com.itheima.constant.MessageConstant;
import com.itheima.healt.entlty.Result;
import com.itheima.mapper.MemberMapper;
import com.itheima.mapper.SetMealMapper;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.util.*;

@Service
@Transactional
public class ReportServiceImpl implements ReportService {

    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private SetMealMapper setMealMapper;

    @Override
    public Result getMemberReportLast12Month() {
        try {
            //  目标： 得到 2019-8 ....    1-31查询会员总数量 100； 这2 个数据 往List 集合中封装
            //所以先创建 2个List 集合
            List<String> yearAndMoth = new ArrayList<>();
            List<Long> memberCounts = new ArrayList<>();

            //获取日历对象
            Calendar calendar = Calendar.getInstance();
            //设置日历往前推12个月
            calendar.add(Calendar.MONTH, -12);
            List list = new ArrayList();
            for (int i = 0; i < 12; i++) {
                //获取每个月的时间
                Date time = calendar.getTime();
                //获取每个月的月份
                String month = new SimpleDateFormat("yyyy-MM").format(time);
                // 转换好日期之后  将我们需要的 xxxx年xx月 +“1”  和  xxxx年xx月 +“31”
                String beginDate = month + "-1";
                String endDate = month + "-31";
                // 查询 每个月的会员数量   查询的Sql语句条件 就是 beginDate  ；  endDate
                Long num = memberMapper.findMenberCountsByDate(beginDate, endDate);
                // 每次获得一个月份 都+1
                calendar.add(Calendar.MONTH, 1);
                //将得到的月份添加到年月的List集合中去
                yearAndMoth.add(month);
                //将从Sql 中查询的总人数 添加到 人数List的集合中去
                memberCounts.add(num);

            }
            // 因为最后是要封装到Map 集合中  所以先创建一个Map 集合
            Map map = new HashMap();
            //将数据通过Key Value 的形式 封装到Map 集合中  注意：  这里的key 与 前端 接收的key 要照应
            map.put("months", yearAndMoth);
            map.put("memberCounts", memberCounts);
            System.out.println(map);
            return new Result(true, MessageConstant.GET_MEMBER_NUMBER_REPORT_SUCCESS, map);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.GET_MEMBER_NUMBER_REPORT_FAIL);
        }

    }

    @Override
    public Result getSetmealReport() {
        try {

            Map map=new HashMap();
            List<String> list= new ArrayList<>();

            // 创建一个 法发  直接将通过Sql 语句查询的参数  放到 resultMap 中
                    // 因为前端 要求的格式是list 数组格式，而数据类型 又是 key value 形式  所以这里将查询到的数据
                        // 用  List<Map> resultMap 接收
         List<Map> resultMap = setMealMapper.findSetmealReport();
                    // 这里 得到数据库中查询到的所有信息  然后 循环迭代 resultMap 集合
                    //  由此得到 resultMap 套餐名称 的数据  封装到 list 中
            for (Map map1 : resultMap) {
                //  这name 对应的是Sql 语句中编写的 name 套餐名字  自定义的 别名
               String sermealName = (String) map1.get("name");
                //  for 循环 得到 resultMap  中的   套餐名称  然后放到 List集合中去
                list.add(sermealName);
            }
            map.put("setmealNames",list);
            map.put("setmealCounts",resultMap);
            System.out.println(list);

            return new Result(true, MessageConstant.GET_SETMEAL_COUNT_REPORT_SUCCESS,map);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.GET_SETMEAL_COUNT_REPORT_FAIL);
        }
    }
}
